#include <mips/regdef.h>
#include <sys/syscall.h>

	.text
	.align  2
	.globl	unix2dos
	.ent	unix2dos

unix2dos:
	.frame	$fp, 40, ra
	.set	noreorder
	.cpload	t9
	.set	reorder

	#creo el stack frame
	subu	sp, sp, 40

	.cprestore 24

	# preservo ra, fp y gp.
	sw		ra, 32(sp)
	sw		$fp, 28(sp)

	move	$fp, sp

	#guardo los argumentos (a0 = FILE* input, a1 = FILE* output, a2 = FILE* error)
	sw		a0, 40($fp)
	sw		a1, 44($fp)
	sw		a2, 48($fp)

leer_caracter:
	#llamo a leer un caracter
	# creo un buffer en 16($fp).
	li		v0, SYS_read   	# v0: system call code (read).
	lw		a0, 40($fp)     # a0: file descriptor.
	addiu	a1, $fp, 16		# a1: data pointer.
	li		a2, 1           # a2: data length.
	syscall

	#comparo si (caracter == EOF)
	beqz	v0, salir

	# Verificamos el c�digo de retorno de la llamada al system call
	# SYS_read: esto involucra dos pasos: primero, ver si $a3 tiene
	# valor nulo; y luego verificar que la cantidad de informaci�n
	# escrita ($v0), coincida con la cantidad de informaci�n enviada.
	#
	bnez	a3, error_lectura
	bne		v0, 1, error_lectura

	#comparo si (caracter == barraN)
	lb		t0, 16($fp)
	lb		t1, barraN
	beq		t0, t1, escribir_barraR

escribir_caracter:
	li		v0,SYS_write
	lw		a0, 44($fp)
	la		a1, 16($fp)
	li		a2, 1
	syscall

	bnez	a3, error_escritura
	bne		v0, 1, error_escritura

	b		leer_caracter

escribir_barraR:
	li		v0, SYS_write
	lw		a0, 44($fp)
	la		a1, barraR
	li		a2, 1
	syscall

	# si no pudo escribir
	bnez	a3, error_escritura
	bne		v0, 1, error_escritura

	b		escribir_caracter

error_escritura:
	# escribo en archivo de errores
	li		v0, SYS_write
	lw		a0, 48($fp)
	la		a1, msg_error_escritura
	li		a2, 16
	syscall

	# si no pudo escribir en el archivo de errores,
	# sys_exit.
	bnez	a3, exit_error
	bne		v0, 16, exit_error

	li		v0, 1
	b		salir

error_lectura:
	# escribo en archivo de errores
	li		v0, SYS_write
	lw		a0, 48($fp)
	la		a1, msg_error_lectura
	li		a2, 14
	syscall

	# si no pudo escribir en el archivo de errores,
	# sys_exit.
	bnez	a3, exit_error
	bne		v0, 14, exit_error

	li		v0, 1
	b		salir
exit_error:
	# devuelvo 1 (es error)
	li	v0, SYS_exit
	li	a0, 1
	syscall

salir:
	#destruyo el stack frame.
	move	sp, $fp
	lw		ra, 32(sp)
	lw		$fp, 28(sp)
	addu	sp, sp, 40
	j		ra
	.end	unix2dos

.rdata

msg_error_lectura:
 	.asciiz "ERROR LECTURA\n"

msg_error_escritura:
	.asciiz "ERROR ESCRITURA\n"

barraN:
	.byte	10

barraR:
	.byte	13
